package com.shrcl.engineerprocess.domain;

import com.shrcl.engineerprocess.domain.Engineer;
import com.shrcl.engineerprocess.domain.EngineerCostEstimation;
import com.shrcl.engineerprocess.domain.EngineerProjectJob;
import com.shrcl.engineerprocess.domain.EngineerProjectStatus;
import com.shrcl.engineerprocess.domain.impl.EngineerProjectImpl;
import com.shrcl.engineerprocess.domain.proxy.EngineerProjectProxy;
import com.shrct.businessprocess.project.RCProject;
import edu.fudan.mylang.pf.EntityImplementation;
import edu.fudan.mylang.pf.IModelObject;
import java.util.Collection;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;

@EntityImplementation(implementBy = EngineerProjectImpl.class)
public interface EngineerProject extends IModelObject {
  public abstract EngineerCostEstimation getTscCostEstimation();
  
  public abstract EngineerProject setTscCostEstimation(final EngineerCostEstimation tscCostEstimation);
  
  public abstract Engineer getProjectManager();
  
  public abstract EngineerProject setProjectManager(final Engineer projectManager);
  
  public abstract Engineer getTechLeader();
  
  public abstract EngineerProject setTechLeader(final Engineer techLeader);
  
  public abstract Collection<Engineer> getTeamMembers();
  
  public abstract EngineerProject addtoTeamMembers(final Engineer engineer);
  
  public abstract EngineerProject setTeamMembers(final Iterable<Engineer> teamMembers);
  
  public abstract EngineerProject removeFromTeamMembers(final Engineer engineer);
  
  public abstract EngineerProject removeAllTeamMembers();
  
  public abstract RCProject getCBDProject();
  
  public abstract Collection<EngineerProjectJob> getProjectJobs();
  
  public abstract EngineerProjectJob createAndAddtoProjectJobs();
  
  public abstract EngineerProjectJob createAndAddtoProjectJobs(final Procedure1<EngineerProjectJob> updater);
  
  public abstract EngineerProject removeFromProjectJobs(final EngineerProjectJob engineerProjectJob);
  
  public abstract EngineerProject removeAllProjectJobs();
  
  public abstract String getRCProjectName();
  
  public abstract String getRCProjectCode();
  
  public abstract EngineerProjectStatus getStatus();
  
  public abstract void start();
  
  public abstract void kickoff();
  
  public abstract void finish();
  
  public abstract EngineerProjectJob addProjectJob(final Procedure1<? super EngineerProjectJob> init);
  
  public abstract void delProjectJob(final EngineerProjectJob engineerProjectJob);
  
  public abstract Boolean isCreated();
  
  public abstract Boolean isKicked();
  
  public abstract Boolean isFinished();
  
  public abstract EngineerProjectProxy toProxy();
}
